From 8bfc6afe33467a03ea2ab39afbab86052d0dce23 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 21 Mar 2021 18:51:57 -0400 Subject: [PATCH] imcontext: Improve dead key handling more MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit For sequences like ``, we want to commit the first deadkey and then continue preedit with the second. The alternative is to do chained deadkeys, where entering ~~a yields ̃̀̃̃a. But we don't do that, and I think that would be more controversial. --- gtk/gtkimcontextsimple.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c index 06ca6ca6bb..9c1024e0c3 100644 --- a/gtk/gtkimcontextsimple.c +++ b/gtk/gtkimcontextsimple.c @@ -922,6 +922,39 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, output = g_string_new (""); + if (n_compose == 2) + { + /* Special-case deadkey-deadkey sequences. + * We are not doing chained deadkeys, so we + * want to commit the first key, and contine + * preediting with second. + */ + if (is_dead_key (priv->compose_buffer[0]) && + is_dead_key (priv->compose_buffer[1])) + { + gunichar ch; + gboolean need_space; + guint next; + + next = priv->compose_buffer[1]; + + ch = dead_key_to_unicode (priv->compose_buffer[0], &need_space); + if (ch) + { + if (need_space) + g_string_append_c (output, ' '); + g_string_append_unichar (output, ch); + + gtk_im_context_simple_commit_string (context_simple, output->str); + g_string_set_size (output, 0); + + priv->compose_buffer[0] = next; + priv->compose_buffer[1] = 0; + n_compose = 1; + } + } + } + G_LOCK (global_tables); tmp_list = global_tables; -- 2.30.2